package com.ads.tpgrupo4.domain.cpr.remito;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import com.ads.tpgrupo4.domain.cpr.core.Cliente;
import com.ads.tpgrupo4.domain.cpr.ordenDePedido.OrdenDePedido;

@Entity
@DiscriminatorValue("1")
public class RemitoACliente extends Remito {

	private static final long serialVersionUID = 1L;

	private EstadoRemitoACliente estadoRemitoCliente;
	
	private Boolean facturado;
	
	@OneToOne
	private Cliente cliente;
	
	@OneToMany(cascade = {CascadeType.ALL})
	private List<OrdenDePedido> ordenesDePedidoOrigen;
	
	@OneToMany(cascade = {CascadeType.ALL}, fetch=FetchType.EAGER )
	private List<ItemRemitoACliente> items;

	private Date fechaEntrega;
	
	private String comentarios;

	public RemitoACliente() {
		
		this.facturado = false;
		this.items = new LinkedList<ItemRemitoACliente>();
	}
	
	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public List<OrdenDePedido> getOrdenesDePedidoOrigen() {
		return ordenesDePedidoOrigen;
	}

	public void setOrdenesDePedido(List<OrdenDePedido> ordenesDePedidoOrigen) {
		this.ordenesDePedidoOrigen = ordenesDePedidoOrigen;
	}

	public List<ItemRemitoACliente> getItems() {
		return items;
	}

	public void setItems(List<ItemRemitoACliente> items) {
		this.items = items;
	}

	public String getComentarios() {
		return comentarios;
	}

	public void setComentarios(String comentarios) {
		this.comentarios = comentarios;
	}

	public void setOrdenesDePedidoOrigen(List<OrdenDePedido> ordenesDePedidoOrigen) {
		this.ordenesDePedidoOrigen = ordenesDePedidoOrigen;
	}

	public Date getFechaEntrega() {
		return fechaEntrega;
	}

	public void setFechaEntrega(Date fechaEntrega) {
		this.fechaEntrega = fechaEntrega;
	}

	public EstadoRemitoACliente getEstadoRemitoCliente() {
		return estadoRemitoCliente;
	}

	public void setEstadoRemitoCliente(EstadoRemitoACliente estadoRemitoCliente) {
		this.estadoRemitoCliente = estadoRemitoCliente;
	}
	
	public Boolean getFacturado() {
		return facturado;
	}

	public void setFacturado(Boolean facturado) {
		this.facturado = facturado;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = super.hashCode();
		result = prime * result + ((cliente == null) ? 0 : cliente.hashCode());
		result = prime * result
				+ ((comentarios == null) ? 0 : comentarios.hashCode());
		result = prime
				* result
				+ ((estadoRemitoCliente == null) ? 0 : estadoRemitoCliente
						.hashCode());
		result = prime * result
				+ ((fechaEntrega == null) ? 0 : fechaEntrega.hashCode());
		result = prime * result + ((items == null) ? 0 : items.hashCode());
		result = prime
				* result
				+ ((ordenesDePedidoOrigen == null) ? 0 : ordenesDePedidoOrigen
						.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (!super.equals(obj))
			return false;
		if (getClass() != obj.getClass())
			return false;
		RemitoACliente other = (RemitoACliente) obj;
		if (cliente == null) {
			if (other.cliente != null)
				return false;
		} else if (!cliente.equals(other.cliente))
			return false;
		if (comentarios == null) {
			if (other.comentarios != null)
				return false;
		} else if (!comentarios.equals(other.comentarios))
			return false;
		if (estadoRemitoCliente != other.estadoRemitoCliente)
			return false;
		if (fechaEntrega == null) {
			if (other.fechaEntrega != null)
				return false;
		} else if (!fechaEntrega.equals(other.fechaEntrega))
			return false;
		if (items == null) {
			if (other.items != null)
				return false;
		} else if (!items.equals(other.items))
			return false;
		if (ordenesDePedidoOrigen == null) {
			if (other.ordenesDePedidoOrigen != null)
				return false;
		} else if (!ordenesDePedidoOrigen.equals(other.ordenesDePedidoOrigen))
			return false;
		return true;
	}

}
